package code.example.base.lang.binding;

/**
 *  动态绑定，静态绑定
 *
 *  属性引用：静态绑定， 用哪个类引用的，就调用该类的属性值。
 *  方法重载调用：静态绑定，根据参数声明类型，确认调用哪个重载方法
 *  方法调用（父子 override）： 调用实际类型的方法。与类型转换无关。
 *
 */

public class TestBind {
    class Printer{
        public void print(Integer x){
            System.out.println("integer:"+x);
        }
        public void print(Number number){
            System.out.println("number:"+number);
        }
    }
    class A {
        public int age = 30;
        public int getAge(){
            return this.age;
        }
    }

    class B extends A{
        public int age = 10;
        public int getAge(){
            return this.age;
        }
    }


    public void printAge(){
        B b = new B();
        System.out.println(b.age);//10  属性引用：静态绑定
        System.out.println(((A)b).age);//30 属性引用：静态绑定

        System.out.println(b.getAge()); //10 方法调用：动态绑定
        System.out.println(((A)b).getAge());//10  方法调用：动态绑定
    }
    public void test(){
        Integer integer = new Integer(10);
        Number num = integer;
        Printer printer = new Printer();
        printer.print(num); //输出： number:10  方法参数类型是静态绑定
        printAge();
    }
    public static void main(String args []){
        new TestBind().test();
    }
}
